package com.gl.codingdojo.buscaminas;

public class Buscaminas {
	
	private Celda[][] celdas;
	private boolean finalizado = false;
	private boolean gano;
	private int destadas = 0;
	private int cantidadBombas;
	private int ancho;
	private int alto;

	public Buscaminas(int ancho, int alto) {
		this.ancho = ancho;
		this.alto = alto;
		
		celdas = new Celda[ancho][alto];
		
		for (int x = 0; x < ancho; x++) {
			for (int y = 0; y < alto; y++) {
				celdas[x][y] = new CeldaVacia( this, x, y );
			}
		}
	}

	public void setBomba(int x, int y) {
		if( !hayBomba(x, y) )
		{
			celdas[x][y] = new CeldaMinada( this );
			cantidadBombas++;
		}
	}

	public void marcar(int x, int y) {
		celdas[x][y].marcar();
		evaluarFin();
	}

	public boolean estaFinalizado() {
		return finalizado;
	}

	public boolean estaGanado() {
		return gano;
	}

	public void pisar(int x, int y) {
		if( coordenadasValidas(x, y) 
			&& celdas[x][y].estaTapada() )
		{	
			celdas[x][y].pisar();
			destadas ++;
			evaluarFin();
		}
	}
	
	private boolean coordenadasValidas(int x, int y){
		return( x >= 0 && x < ancho
			&& y >= 0 && y < alto );
	}
	private void evaluarFin()
	{
		if( !finalizado  
			&& ( destadas + cantidadBombas == ( ancho * alto ) ) )
		{
			ganar();
		}
	}

	public void perder() {
		finalizado = true;
		gano = false;
	}

	public void ganar() {
		finalizado = true;
		gano = true;
	}

	protected boolean hayBomba(int x, int y) {
		return coordenadasValidas(x, y) && ( celdas[x][y].tieneBomba() );
	}
	
	public String toString()
	{
		StringBuffer stringBuscaminas = new StringBuffer();
		for (int x = 0; x < ancho; x++) {
			for (int y = 0; y < alto; y++) {
				 stringBuscaminas.append( celdas[x][y].toString() );
			}
			stringBuscaminas.append("\n");
		}
		return stringBuscaminas.toString();
	}

}
